home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 2000 April: Mac OS SDK / Dev.CD Apr 00 SDK1.toast / Development Kits / Mac OS / Open Transport 1.3 / Open Transport SDK / Open Tpt Client Developer / Samples / Internet / OTDNRSample.cp < prev    next >
Encoding:
Text File  |  1998-04-30  |  21.4 KB  |  758 lines  |  [TEXT/MPS ]

  1. /*
  2.     File:        OTDNRSample.cp
  3.  
  4.     Contains:    Sample showing use of the Open Transport MacTCP Domain Name Resolver
  5.  
  6.     Copyright:    © 1994-1997 by Apple Computer, Inc., all rights reserved.
  7.  
  8. */
  9.  
  10. #include <Types.h>
  11. #include <Events.h>
  12. #include <SegLoad.h>
  13. #include <String.h>
  14. #include <strings.h>
  15. #include <Quickdraw.h>
  16. #include <Stdio.h>
  17. #include <StdLib.h>
  18. #include <Menus.h>
  19. #include <Devices.h>
  20. #include <OpenTptInternet.h>
  21.  
  22. const UInt16        kNumMX    = 10;
  23. const size_t        kQueryBufSize = 4096;                         
  24. const size_t        kArgBufSize = 8;                                // Support eight argvs 
  25.  
  26. Boolean             gCallCompleted = false;
  27. InetSvcRef             gSvc = NULL;
  28.  
  29. InetDomainName        gDomainName;
  30. InetHostInfo        gMyHInfo;
  31. InetSysInfo            gMySysInfo;
  32. InetMailExchange    gMyMX[kNumMX];
  33. UInt16                gNumMX;    
  34. UInt8                gQueryBuf[kQueryBufSize];
  35. void*                gArgBuf[kArgBufSize];
  36. OTResult            gTestResult = kOTNoError;
  37.  
  38. const int kStrToAddrTest        = 1;
  39. const int kAddrToNameTest        = 2;
  40. const int kSysInfoTest            = 3;
  41. const int kMXTest                = 4;
  42. const int kQueryTest            = 5;
  43. enum
  44. {
  45.     kAType            = 1,
  46.     kNSType            = 2,
  47.     kMDType            = 3,
  48.     kMFType            = 4,
  49.     kCNameType        = 5,
  50.     kSOAType        = 6,
  51.     kMBType            = 7,
  52.     kMGType            = 8,
  53.     kMRType            = 9,
  54.     kNullType        = 10,
  55.     kWKSType        = 11,
  56.     kPtrType        = 12,
  57.     kHInfoType        = 13,
  58.     kMInfoType        = 14,
  59.     kMXType            = 15,
  60.     kTxtType        = 16,
  61.     kRPType            = 17,
  62.     kAFDSBType        = 18,
  63.     kX25Type        = 19,
  64.     kISDNType        = 20,
  65.     kRTType            = 21,
  66.     kAXFRTYpe        = 252,
  67.     kMailBType        = 253,
  68.     kMailAType         = 254,
  69.     kWIldCardType    = 255
  70. };
  71.  
  72. struct WKSEntry 
  73. {
  74.     UInt8    WKSAddr[4];
  75.     UInt8    WKSProto;
  76.     char    WKSBitMask[4];
  77. };
  78. typedef struct WKSEntry WKSEntry;
  79.  
  80.  
  81. const char* TypeOfQuery[256] = {"Unknown", "A", "NS", "MD", "MF", "CNAME",
  82.                                 "SOA", "MB", "MG", "MR", "Null", "WKS",
  83.                                 "PTR", "HINFO", "MINFO", "MX", "TXT", "RP",
  84.                                 "AFDSB", "X25", "ISDN", "RTT",
  85.                                 "Unknown", "Unknown", "Unknown", "Unknown", "Unknown", 
  86.                                 "Unknown", "Unknown", "Unknown", "Unknown", "Unknown",
  87.                                 "Unknown", "Unknown", "Unknown", "Unknown", "Unknown", 
  88.                                 "Unknown", "Unknown", "Unknown", "Unknown", "Unknown",
  89.                                 "Unknown", "Unknown", "Unknown", "Unknown", "Unknown", 
  90.                                 "Unknown", "Unknown", "Unknown", "Unknown", "Unknown",
  91.                                 "Unknown", "Unknown", "Unknown", "Unknown", "Unknown", 
  92.                                 "Unknown", "Unknown", "Unknown", "Unknown", "Unknown",
  93.                                 "Unknown", "Unknown", "Unknown", "Unknown", "Unknown", 
  94.                                 "Unknown", "Unknown", "Unknown", "Unknown", "Unknown",
  95.                                 "Unknown", "Unknown", "Unknown", "Unknown", "Unknown", 
  96.                                 "Unknown", "Unknown", "Unknown", "Unknown", "Unknown",
  97.                                 "Unknown", "Unknown", "Unknown", "Unknown", "Unknown", 
  98.                                 "Unknown", "Unknown", "Unknown", "Unknown", "Unknown",
  99.                                 "Unknown", "Unknown", "Unknown", "Unknown", "Unknown", 
  100.                                 "Unknown", "Unknown", "Unknown", "Unknown", "Unknown",
  101.                                 "Unknown", "Unknown", "Unknown", "Unknown", "Unknown", 
  102.                                 "Unknown", "Unknown", "Unknown", "Unknown", "Unknown",
  103.                                 "Unknown", "Unknown", "Unknown", "Unknown", "Unknown", 
  104.                                 "Unknown", "Unknown", "Unknown", "Unknown", "Unknown",
  105.                                 "Unknown", "Unknown", "Unknown", "Unknown", "Unknown", 
  106.                                 "Unknown", "Unknown", "Unknown", "Unknown", "Unknown",
  107.                                 "Unknown", "Unknown", "Unknown", "Unknown", "Unknown", 
  108.                                 "Unknown", "Unknown", "Unknown", "Unknown", "Unknown",
  109.                                 "Unknown", "Unknown", "Unknown", "Unknown", "Unknown", 
  110.                                 "Unknown", "Unknown", "Unknown", "Unknown", "Unknown",
  111.                                 "Unknown", "Unknown", "Unknown", "Unknown", "Unknown", 
  112.                                 "Unknown", "Unknown", "Unknown", "Unknown", "Unknown",
  113.                                 "Unknown", "Unknown", "Unknown", "Unknown", "Unknown", 
  114.                                 "Unknown", "Unknown", "Unknown", "Unknown", "Unknown",
  115.                                 "Unknown", "Unknown", "Unknown", "Unknown", "Unknown", 
  116.                                 "Unknown", "Unknown", "Unknown", "Unknown", "Unknown",
  117.                                 "Unknown", "Unknown", "Unknown", "Unknown", "Unknown", 
  118.                                 "Unknown", "Unknown", "Unknown", "Unknown", "Unknown",
  119.                                 "Unknown", "Unknown", "Unknown", "Unknown", "Unknown", 
  120.                                 "Unknown", "Unknown", "Unknown", "Unknown", "Unknown",
  121.                                 "Unknown", "Unknown", "Unknown", "Unknown", "Unknown", 
  122.                                 "Unknown", "Unknown", "Unknown", "Unknown", "Unknown",
  123.                                 "Unknown", "Unknown", "Unknown", "Unknown", "Unknown", 
  124.                                 "Unknown", "Unknown", "Unknown", "Unknown", "Unknown",
  125.                                 "Unknown", "Unknown", "Unknown", "Unknown", "Unknown", 
  126.                                 "Unknown", "Unknown", "Unknown", "Unknown", "Unknown",
  127.                                 "Unknown", "Unknown", "Unknown", "Unknown", "Unknown", 
  128.                                 "Unknown", "Unknown", "Unknown", "Unknown", "Unknown",
  129.                                 "Unknown", "Unknown", "Unknown", "Unknown", "Unknown", 
  130.                                 "Unknown", "Unknown", "Unknown", "Unknown", "Unknown",
  131.                                 "AXFR", "MAILB", "MAILA", "WILDCARD"};
  132.                                 
  133. const char*    TypeOfClass[256] = {"Unknown", "IN", "CS", "CH", "HS",
  134.                                 "Unknown", "Unknown", "Unknown", "Unknown", "Unknown", 
  135.                                 "Unknown", "Unknown", "Unknown", "Unknown", "Unknown",
  136.                                 "Unknown", "Unknown", "Unknown", "Unknown", "Unknown", 
  137.                                 "Unknown", "Unknown", "Unknown", "Unknown", "Unknown",
  138.                                 "Unknown", "Unknown", "Unknown", "Unknown", "Unknown", 
  139.                                 "Unknown", "Unknown", "Unknown", "Unknown", "Unknown",
  140.                                 "Unknown", "Unknown", "Unknown", "Unknown", "Unknown", 
  141.                                 "Unknown", "Unknown", "Unknown", "Unknown", "Unknown",
  142.                                 "Unknown", "Unknown", "Unknown", "Unknown", "Unknown", 
  143.                                 "Unknown", "Unknown", "Unknown", "Unknown", "Unknown",
  144.                                 "Unknown", "Unknown", "Unknown", "Unknown", "Unknown", 
  145.                                 "Unknown", "Unknown", "Unknown", "Unknown", "Unknown",
  146.                                 "Unknown", "Unknown", "Unknown", "Unknown", "Unknown", 
  147.                                 "Unknown", "Unknown", "Unknown", "Unknown", "Unknown",
  148.                                 "Unknown", "Unknown", "Unknown", "Unknown", "Unknown", 
  149.                                 "Unknown", "Unknown", "Unknown", "Unknown", "Unknown",
  150.                                 "Unknown", "Unknown", "Unknown", "Unknown", "Unknown", 
  151.                                 "Unknown", "Unknown", "Unknown", "Unknown", "Unknown",
  152.                                 "Unknown", "Unknown", "Unknown", "Unknown", "Unknown", 
  153.                                 "Unknown", "Unknown", "Unknown", "Unknown", "Unknown",
  154.                                 "Unknown", "Unknown", "Unknown", "Unknown", "Unknown", 
  155.                                 "Unknown", "Unknown", "Unknown", "Unknown", "Unknown",
  156.                                 "Unknown", "Unknown", "Unknown", "Unknown", "Unknown", 
  157.                                 "Unknown", "Unknown", "Unknown", "Unknown", "Unknown",
  158.                                 "Unknown", "Unknown", "Unknown", "Unknown", "Unknown", 
  159.                                 "Unknown", "Unknown", "Unknown", "Unknown", "Unknown",
  160.                                 "Unknown", "Unknown", "Unknown", "Unknown", "Unknown", 
  161.                                 "Unknown", "Unknown", "Unknown", "Unknown", "Unknown",
  162.                                 "Unknown", "Unknown", "Unknown", "Unknown", "Unknown", 
  163.                                 "Unknown", "Unknown", "Unknown", "Unknown", "Unknown",
  164.                                 "Unknown", "Unknown", "Unknown", "Unknown", "Unknown", 
  165.                                 "Unknown", "Unknown", "Unknown", "Unknown", "Unknown",
  166.                                 "Unknown", "Unknown", "Unknown", "Unknown", "Unknown", 
  167.                                 "Unknown", "Unknown", "Unknown", "Unknown", "Unknown",
  168.                                 "Unknown", "Unknown", "Unknown", "Unknown", "Unknown", 
  169.                                 "Unknown", "Unknown", "Unknown", "Unknown", "Unknown",
  170.                                 "Unknown", "Unknown", "Unknown", "Unknown", "Unknown", 
  171.                                 "Unknown", "Unknown", "Unknown", "Unknown", "Unknown",
  172.                                 "Unknown", "Unknown", "Unknown", "Unknown", "Unknown", 
  173.                                 "Unknown", "Unknown", "Unknown", "Unknown", "Unknown",
  174.                                 "Unknown", "Unknown", "Unknown", "Unknown", "Unknown", 
  175.                                 "Unknown", "Unknown", "Unknown", "Unknown", "Unknown",
  176.                                 "Unknown", "Unknown", "Unknown", "Unknown", "Unknown", 
  177.                                 "Unknown", "Unknown", "Unknown", "Unknown", "Unknown",
  178.                                 "Unknown", "Unknown", "Unknown", "Unknown", "Unknown", 
  179.                                 "Unknown", "Unknown", "Unknown", "Unknown", "Unknown", 
  180.                                 "Unknown", "Unknown", "Unknown", "Unknown", "Unknown",
  181.                                 "Unknown", "Unknown", "Unknown", "Unknown", "Unknown", 
  182.                                 "Unknown", "Unknown", "Unknown", "Unknown", "Unknown",
  183.                                 "Unknown", "Unknown", "Unknown", "Unknown", "Unknown",
  184.                                 "WILDCARD"};
  185.  
  186. const char*    TypeOfRR[5] = {"Unknown", "Question", "Answer", "Authority", "Additional"};
  187.  
  188. const char*    TypeOfProtocol[18] = {"Reserved", "ICMP", "IGMP", "GGP", "IP",
  189.                                "ST", "TCP", "UCL", "EGP", "IGP",
  190.                                "BBN-RC-MON", "NVP-II", "PUP", "ARGUS", "EMCON",
  191.                                "XNET", "CHAOS", "UDP"}; // Only Need This Many For Test
  192.  
  193. void Inits()
  194. {
  195.     /*
  196.      * Do standard inits
  197.      */
  198.     InitGraf(&qd.thePort);
  199.     if ( InitOpenTransport() != kOTNoError )
  200.     {
  201.         fprintf(stderr, "dnrtest: Could not initialize ASLM, exiting\n");
  202.         exit(1);
  203.     }
  204. }
  205.  
  206. void CleanMyHInfo()
  207. {
  208.     UInt8* start = (UInt8*)&gMyHInfo;
  209.     size_t idx;
  210.     
  211.     for (idx = 0; idx < sizeof(InetHostInfo); idx++)
  212.         start[idx] = 0;
  213. }
  214.  
  215. void CleanMyDomainName()
  216. {
  217.     UInt8* start = (UInt8*)gDomainName;
  218.     size_t idx;
  219.     
  220.     for (idx = 0; idx < sizeof(gDomainName); idx++)
  221.         start[idx] = 0;
  222. }
  223.  
  224. void CleanMySysInfo()
  225. {
  226.     UInt8* start = (UInt8*)&gMySysInfo;
  227.     size_t idx;
  228.     
  229.     for (idx = 0; idx < sizeof(InetHostInfo); idx++)
  230.         start[idx] = 0;
  231. }
  232.  
  233. void CleanMyMX()
  234. {
  235.     UInt8* start = (UInt8*)gMyMX;
  236.     size_t idx;
  237.     
  238.     for (idx = 0; idx < sizeof(InetMailExchange) * kNumMX; idx++)
  239.         start[idx] = 0;
  240. }
  241.  
  242. void CleanMyQueryBuf()
  243. {
  244.     UInt8* start = (UInt8*)gQueryBuf;
  245.     size_t idx;
  246.     
  247.     for (idx = 0; idx < kQueryBufSize; idx++)
  248.         start[idx] = 0;
  249. }
  250.  
  251. void DoStrToAddr(char* name)
  252. {
  253.     size_t    idx;
  254.     union
  255.     {
  256.         InetHost    addr;
  257.         UInt8        bytes[4];
  258.     } tmpaddr;                
  259.  
  260.     CleanMyHInfo();
  261.     
  262.     OSStatus err = gSvc->StringToAddress(name, &gMyHInfo);
  263.     
  264.     if ( err != kOTNoError )
  265.         gTestResult = err;
  266.     else
  267.     {
  268.         while ( !gCallCompleted )
  269.             ;
  270.     }
  271.     
  272.     switch ( gTestResult )
  273.     {
  274.         case kOTNoError:
  275.             fprintf(stderr, "Canonical Name = %s \n", gMyHInfo.name);
  276.             for ( idx = 0; idx < kMaxHostAddrs; idx++)
  277.             {
  278.                 if ( gMyHInfo.addrs[idx] == NULL )
  279.                     break;
  280.                 tmpaddr.addr = gMyHInfo.addrs[idx];
  281.                 fprintf(stderr, "Address %d = %d.%d.%d.%d \n", idx,
  282.                                  tmpaddr.bytes[0], tmpaddr.bytes[1], 
  283.                                 tmpaddr.bytes[2], tmpaddr.bytes[3]);
  284.             }
  285.             break;
  286.             
  287.         case kENOMEMErr:
  288.             fprintf(stderr, "Memory Depletion!\n");
  289.             break;
  290.             
  291.         case kEINVALErr:
  292.             fprintf(stderr, "Host Address Wrong Size! Shouldn't Happen In This Test!\n");
  293.             break;
  294.             
  295.         case kOTNoDataErr:
  296.             fprintf(stderr, "No Data Available! Either Timeout,or Name Exists But Requested Info Doesn't!\n");
  297.             break;
  298.             
  299.         case kOTBadNameErr:
  300.             fprintf(stderr, "Bad Name! Either Name Does Not Exist in Domains Examined, or Bad Syntax!\n");
  301.             break;
  302.             
  303.         default:
  304.             fprintf(stderr, "Unknown Error!\n");
  305.             break;
  306.     }
  307.     gCallCompleted = false;
  308.     gTestResult = kOTNoError;
  309. }
  310.  
  311.  
  312. void DoAddrToName(InetHost addr)
  313. {
  314.     CleanMyDomainName();
  315.     
  316.     OSStatus err = gSvc->AddressToName(addr, gDomainName);
  317.     
  318.     if ( err != kOTNoError )
  319.         gTestResult = err;
  320.     else
  321.     {
  322.         while ( !gCallCompleted )
  323.             ;
  324.     }
  325.  
  326.     switch ( gTestResult )
  327.     {
  328.         case kOTNoError:
  329.             fprintf(stderr, "Canonical Name = %s \n", gDomainName);
  330.             break;
  331.             
  332.         case kENOMEMErr:
  333.             fprintf(stderr, "Memory Depletion!\n");
  334.             break;
  335.             
  336.         case kEINVALErr:
  337.             fprintf(stderr, "Host Address Wrong Size! How'd That Happen?\n");
  338.             break;
  339.             
  340.         case kOTNoDataErr:
  341.             fprintf(stderr, "No Data Available! Either Timeout,or Name Exists But Requested Info Doesn't!\n");
  342.             break;
  343.             
  344.         case kOTBadNameErr:
  345.             fprintf(stderr, "Bad Address! Either Address Does Not Exist in Domains Examined, or Bad Syntax!\n");
  346.             break;
  347.             
  348.         default:
  349.             fprintf(stderr, "Unknown Error!\n");
  350.             break;
  351.     }
  352.     gTestResult = kOTNoError;
  353.     gCallCompleted = false;
  354. }
  355.  
  356.  
  357. void DoSysInfo(char* name)
  358. {
  359.     CleanMySysInfo();
  360.     
  361.     OSStatus err = gSvc->SysInfo(name, &gMySysInfo);
  362.     
  363.     if ( err != kOTNoError )
  364.         gTestResult = err;
  365.     else
  366.     {
  367.         while ( !gCallCompleted )
  368.             ;
  369.     }
  370.  
  371.     switch ( gTestResult)
  372.     {
  373.         case kOTNoError:
  374.             fprintf(stderr, "CPU Type %s\n", gMySysInfo.cpuType);
  375.             fprintf(stderr, "O/S Type %s\n", gMySysInfo.osType);
  376.             break;
  377.             
  378.         case kENOMEMErr:
  379.             fprintf(stderr, "Memory Depletion!\n");
  380.             break;
  381.             
  382.         case kEINVALErr:
  383.             fprintf(stderr, "Host Address Wrong Size! Shouldn't Happen In This Test!\n");
  384.             break;
  385.             
  386.         case kOTNoDataErr:
  387.             fprintf(stderr, "No Data Available! Either Timeout,or Name Exists But Requested Info Doesn't!\n");
  388.             break;
  389.             
  390.         case kOTBadNameErr:
  391.             fprintf(stderr, "Bad Name! Either Name Does Not Exist in Domains Examined, or Bad Syntax!\n");
  392.             break;
  393.             
  394.         default:
  395.             fprintf(stderr, "Unknown Error!\n");
  396.             break;
  397.     }
  398.     gCallCompleted = false;
  399.     gTestResult = kOTNoError;
  400. }
  401.  
  402.  
  403. void DoMailExchange(char* name)
  404. {
  405.     size_t                idx;
  406.     InetMailExchange*    mailex;
  407.     
  408.     CleanMyMX();
  409.     gNumMX = kNumMX;
  410.     OSStatus err = gSvc->MailExchange( name, &gNumMX, gMyMX);
  411.  
  412.     if ( err != kOTNoError )
  413.         gTestResult = err;
  414.     else
  415.     {
  416.         while ( !gCallCompleted )
  417.             ;
  418.     }
  419.  
  420.     switch ( gTestResult )
  421.     {
  422.         case kOTNoError:
  423.             for ( idx = 0, mailex = gMyMX; idx < kNumMX; idx++, mailex++)
  424.                 if ( mailex->exchange[0] )
  425.                     fprintf(stderr, "Exchange = %s, Preference = %d\n", mailex->exchange, mailex->preference);
  426.             break;
  427.             
  428.         case kENOMEMErr:
  429.             fprintf(stderr, "Memory Depletion!\n");
  430.             break;
  431.             
  432.         case kEINVALErr:
  433.             fprintf(stderr, "Host Address Wrong Size! Shouldn't Happen In This Test!\n");
  434.             break;
  435.             
  436.         case kOTNoDataErr:
  437.             fprintf(stderr, "No Data Available! Either Timeout,or Name Exists But Requested Info Doesn't!\n");
  438.             break;
  439.             
  440.         case kOTBadNameErr:
  441.             fprintf(stderr, "Bad Name! Either Name Does Not Exist in Domains Examined, or Bad Syntax!\n");
  442.             break;
  443.             
  444.         default:
  445.             fprintf(stderr, "Unknown Error!\n");
  446.             break;
  447.     }
  448.     gCallCompleted = false;
  449.     gTestResult = kOTNoError;
  450. }
  451.  
  452. void DoGenericQuery(char* name, UInt16 qclass, UInt16 qtype)
  453. {
  454.     DNSQueryInfo*    qptr;
  455.     int j, i = 0;
  456.     
  457.     CleanMyQueryBuf();
  458.     OSStatus err = gSvc->Query(name, qclass, qtype, (char *)gQueryBuf, kQueryBufSize, 
  459.                                 gArgBuf, kArgBufSize, (OTFlags)0);
  460.  
  461.     if ( err != kOTNoError )
  462.         gTestResult = err;
  463.     else
  464.     {
  465.         while ( !gCallCompleted )
  466.             ;
  467.     }
  468.  
  469.     switch ( gTestResult )
  470.     {
  471.         case kOTBufferOverflowErr:
  472.             fprintf(stderr, "Buffer Overflow! Will print all responses that fit.\n\n");
  473.             // Fall through...
  474.         case kOTNoError:
  475.             qptr = *((DNSQueryInfo**)gArgBuf);
  476.             if (qptr != NULL)
  477.             {
  478.                 fprintf(stderr, "Query Name: %s\n\n", qptr->name);
  479.             }
  480.             while ((qptr != NULL) && (i < kArgBufSize))
  481.             {
  482.                 fprintf(stderr, "Record %d : %s : ", i, TypeOfRR[qptr->responseType]);
  483.                 fprintf(stderr, "Record Type %s, Record Class %s, TTL %d\n", 
  484.                         TypeOfQuery[qptr->qType], TypeOfClass[qptr->qClass],
  485.                         qptr->ttl);
  486.                 switch (qptr->qType)
  487.                 {
  488.                     case kNSType:        // Name server, a domain name, compressed
  489.                     case kMDType:        // Mail domain (obsolete - use MX), compressed
  490.                     case kMFType:        // Mail forwarder (obsolete - use MX), compressed
  491.                     case kCNameType:    // Canonical name, compressed
  492.                     case kMBType:        // Mailbox domain name (experimental), compressed
  493.                     case kMGType:        // Mail group member (experimental), compressed
  494.                     case kMRType:        // Mailbox rename (experiemental), compressed
  495.                     case kPtrType:        // Ptr (domain name), compressed
  496.                         fprintf(stderr, "%s\n", qptr->resourceData);
  497.                         break;
  498.                         
  499.                     case kWKSType:         // Well-Known Services - IP addr, protocol, bitmask
  500.                     {    
  501.                         WKSEntry*    entry = (WKSEntry*)qptr->resourceData;
  502.                         UInt8*        tmpdata = (UInt8 *)(qptr->resourceData) +
  503.                                                         sizeof(UInt32) + sizeof(UInt8);
  504.                         
  505.                         fprintf(stderr, "IP Address %x, Protocol %s, Bitmask ",
  506.                                           *((UInt32 *)(entry->WKSAddr)), 
  507.                                           TypeOfProtocol[entry->WKSProto]);
  508.                         for (j = 0; j < (qptr->resourceLen - sizeof(UInt8) - sizeof(UInt32)); j++)
  509.                             fprintf(stderr, "%02x", *tmpdata++);
  510.                         fprintf(stderr, "\n");
  511.                         break;
  512.                     }
  513.                     
  514.                     case kMXType:
  515.                     {
  516.                         UInt16* pref = (UInt16 *)qptr->resourceData;
  517.                         char*    server = (char *)(qptr->resourceData) + sizeof (UInt16);
  518.                         fprintf(stderr, "Exchange = %s, Preference = %d\n", server, *pref);
  519.                         break;
  520.                     }
  521.                     
  522.                     case kHInfoType:
  523.                     {
  524.                         char* hstuff = qptr->resourceData;
  525.                         UInt8 slen = (UInt8)(*hstuff++);
  526.                         
  527.                         fprintf(stderr, "CPU Type ");
  528.                         for (j = 0; j< slen; j++)
  529.                             fprintf(stderr, "%c", *hstuff++);
  530.                         slen = (UInt8)(*hstuff++);
  531.                         fprintf(stderr, "\nO/S Type ");
  532.                         for (j = 0; j< slen; j++)
  533.                             fprintf(stderr, "%c", *hstuff++);
  534.                         fprintf(stderr, "\n");
  535.                         break;
  536.                     }
  537.                     
  538.                     case kAType:
  539.                     {
  540.                     
  541.                         fprintf(stderr, "Address = %d.%d.%d.%d \n",
  542.                                         (UInt8)qptr->resourceData[0], 
  543.                                         (UInt8)qptr->resourceData[1], 
  544.                                         (UInt8)qptr->resourceData[2], 
  545.                                         (UInt8)qptr->resourceData[3]);
  546.                         break;
  547.                     }
  548.                     
  549.                     case kSOAType:
  550.                     {
  551.                         char*    mname = qptr->resourceData;
  552.                         char*    rname = (char *)(qptr->resourceData + strlen(qptr->resourceData) + 1);
  553.                         size_t     mnamelen = strlen(mname);
  554.                         size_t     rnamelen = strlen(rname);
  555.                         UInt32* myPtr     = (UInt32 *)(rname + rnamelen +1);
  556.                         UInt32     serial     = *myPtr++;
  557.                         UInt32     refresh = *myPtr++;
  558.                         UInt32     retry     = *myPtr++;
  559.                         UInt32     expire     = *myPtr++;
  560.                         UInt32     minimum = *myPtr;
  561.                         
  562.                         fprintf(stderr, "MNAME %s, RNAME %s\n", mname, rname);
  563.                         fprintf(stderr, "SERIAL %d, REFRESH %d, RETRY %d, EXPIRE %d, MINIMUM %d\n",
  564.                                 serial, refresh, retry, expire, minimum);
  565.                         
  566.                         break;
  567.                     }
  568.                     
  569.                     default:
  570.                         for (j = 0; j < qptr->resourceLen; j++)
  571.                             fprintf(stderr, "%02x", (UInt8)(qptr->resourceData[j]));
  572.                 }
  573.                 fprintf(stderr, "\n");
  574.                 i++;
  575.                 qptr = *(((DNSQueryInfo**)gArgBuf) + i);
  576.             };
  577.             break;
  578.             
  579.         case kENOMEMErr:
  580.             fprintf(stderr, "Memory Depletion!\n");
  581.             break;
  582.             
  583.         case kEINVALErr:
  584.             fprintf(stderr, "Host Address Wrong Size! Shouldn't Happen In This Test!\n");
  585.             break;
  586.             
  587.         case kOTNoDataErr:
  588.             fprintf(stderr, "No Data Available! Either Timeout,or Name Exists But Requested Info Doesn't!\n");
  589.             break;
  590.             
  591.         case kOTBadNameErr:
  592.             fprintf(stderr, "Bad Name! Either Name Does Not Exist in Domains Examined, or Bad Syntax!\n");
  593.             break;
  594.             
  595.         default:
  596.             fprintf(stderr, "Unknown Error %d!\n", gTestResult);
  597.             break;
  598.     }
  599.     gCallCompleted = false;
  600.     gTestResult = kOTNoError;
  601. }
  602.  
  603. pascal void EventHandler(void*, OTEventCode, OTResult result, void*)
  604. {
  605.     gTestResult        = result;
  606.     gCallCompleted    = true;
  607.     return;
  608. }
  609.  
  610. int main()
  611. {
  612.     int            testtype;
  613.     int            retval    = 1;
  614.     char        mystr[kMaxHostNameLen];
  615.     char        datastr[kMaxHostNameLen];
  616.     InetHost    addr;
  617.     OSStatus    err;
  618.     
  619.     Inits();
  620.     fflush(stdout);
  621.     
  622.     do
  623.     {
  624.         gSvc = OTOpenInternetServices(kDefaultInternetServicesPath, NULL, &err);
  625.         if ( gSvc == NULL ||  err != kOTNoError )
  626.         {
  627.             fprintf(stderr,"Could not open Inet Services\n");
  628.             return retval;
  629.         }
  630.         /*
  631.          * Now install a notifier for async events
  632.          * and then go back to async mode.
  633.          */
  634.         err = gSvc->InstallNotifier((OTNotifyProcPtr)&EventHandler, 0);
  635.         if ( err != kOTNoError )
  636.         {
  637.             fprintf(stderr,"Install notifier failed\n");
  638.             return retval;
  639.         }
  640.         err = gSvc->SetAsynchronous();
  641.         if ( err != kOTNoError )
  642.         {
  643.             fprintf(stderr,"Could not set asynchronous mode on svc\n");
  644.             return retval;
  645.         }
  646.     
  647.         do
  648.         {
  649.             fprintf(stderr, "Select a DNR operation. \n Enter '1' for StringToAddress, \n '2' for AddressToName, \n '3' for SysInfo, \n '4' for MailExchange, \n '5' for Generic Query, \n or 'q' to quit. \n");
  650.             if ( gets(mystr) != 0 ) 
  651.             {
  652.                 if ( strcmp(mystr, "1") == 0 )
  653.                     testtype = kStrToAddrTest;
  654.                 else if ( strcmp(mystr, "2") == 0 )
  655.                     testtype = kAddrToNameTest;
  656.                 else if ( strcmp(mystr, "3") == 0 )
  657.                     testtype = kSysInfoTest;
  658.                 else if ( strcmp(mystr, "4") == 0 )
  659.                     testtype = kMXTest;
  660.                 else if ( strcmp(mystr, "5") == 0 )
  661.                     testtype = kQueryTest;
  662.                 else if ( strcmp(mystr, "q") == 0 )
  663.                     break;
  664.                 else 
  665.                 {
  666.                     fprintf(stderr, "Invalid character entered. Please try again.\n");
  667.                     continue;
  668.                 }
  669.             }
  670.             switch ( testtype )
  671.             {
  672.                 case kStrToAddrTest:
  673.                 
  674.                     fprintf(stderr, "StringToAddr Test. Please enter a name to resolve...\n"); 
  675.                     if ( gets(mystr) != 0 ) 
  676.                         DoStrToAddr(mystr);
  677.                     else
  678.                         fprintf(stderr, "Couldn't get name from window!\n");
  679.                     break;
  680.     
  681.                 case kAddrToNameTest:
  682.                     fprintf(stderr, "AddressToName Test. Please enter an address to resolve...\n"); 
  683.                     if ( gets(mystr) != 0 ) 
  684.                     {
  685.                         OTInetStringToHost(mystr, &addr);
  686.                         DoAddrToName(addr);
  687.                     }
  688.                     break;
  689.                     
  690.                 case kSysInfoTest:
  691.                     fprintf(stderr, "SysInfo Test. Please enter a name to resolve...\n"); 
  692.                     if ( gets(mystr) != 0 ) 
  693.                         DoSysInfo(mystr);
  694.                     else
  695.                         fprintf(stderr, "Couldn't get name from window!\n");
  696.                     break;
  697.                     
  698.                 case kMXTest:
  699.                     fprintf(stderr, "Mail Exchange Test. Please enter a name to resolve...\n"); 
  700.                     if ( gets(mystr) != 0 ) 
  701.                         DoMailExchange(mystr);
  702.                     else
  703.                         fprintf(stderr, "Couldn't get name from window!\n");
  704.                     break;
  705.                     
  706.                 case kQueryTest:
  707.                 
  708.                 {
  709.                     UInt16    queryClass; 
  710.                     UInt16    queryType; 
  711.                 
  712.                     fprintf(stderr, "Generic Query Test. Please enter a name to resolve...\n"); 
  713.                     if ( gets(mystr) == 0 )
  714.                     {
  715.                         fprintf(stderr, "Couldn't get name from window!\n");
  716.                         break;
  717.                     }
  718.                     fprintf(stderr, "Please enter the query class (1 for INET; 255 or '*' For All Classes)...\n"); 
  719.                     if ( gets(datastr) == 0 )
  720.                     {
  721.                         fprintf(stderr, "Couldn't get class from window!\n");
  722.                         break;
  723.                     }
  724.                     if (*datastr == '*')
  725.                         queryClass = kWIldCardType;
  726.                     else
  727.                         queryClass = (UInt16)(atoi(datastr));
  728.                     fprintf(stderr, "Please enter the query type (1 through 254; 255 or '*' For All Types)...\n"); 
  729.                     if ( gets(datastr) == 0 )
  730.                     {
  731.                         fprintf(stderr, "Couldn't get type from window!\n");
  732.                         break;
  733.                     }
  734.                     if (*datastr == '*')
  735.                         queryType = kWIldCardType;
  736.                     else
  737.                         queryType = (UInt16)(atoi(datastr));
  738.                     DoGenericQuery(mystr, queryClass, queryType);
  739.                     break;
  740.                 }
  741.     
  742.                 default:
  743.                     break;
  744.                 
  745.             }
  746.         } while (true);
  747.     } while ( false );
  748.     
  749.     fprintf(stderr, "Tests Completed.\n");
  750.     
  751.     if ( gSvc != NULL )
  752.         gSvc->Close();
  753.  
  754.     return retval;
  755. }
  756.  
  757.  
  758.